package com.young.dubbo.protocol.http;


import com.young.dubbo.framework.URL;
import com.young.dubbo.provider.api.HelloService;
import com.young.dubbo.register.RemoteMapRegister;
import org.apache.catalina.*;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.core.StandardHost;
import org.apache.catalina.startup.Tomcat;

/**
 * 使用内嵌的tomcat 模式一个servlet 容器，处理远程调用请求
 */
public class HttpServer {
    public void start(String hostname, int port,String interfaceName) {
        // 1、创建tomcat 对象
        Tomcat tomcat = new Tomcat();

        // 获取服务器对象，Server整个Servlet容器组合，可以包含一个或多个Service
        Server server = tomcat.getServer();
        // 获取具体的服务,默认启动后就只有一个名称为Tomcat的服务，一个Service由一个或者多个Connector组成，以及一个Engine，负责处理所有Connector所获得的客户请求。
        Service service = server.findService("Tomcat");

        // 创建连接器，客户端与程序交互组件，负责接收请求以及向客户端返回响应
        Connector connector = new Connector();
        connector.setPort(port);

        // 创建引擎，处理连接器接收到请求
        Engine engine = new StandardEngine();
        engine.setDefaultHost(hostname);

        // 创建host，虚拟主机
        Host host = new StandardHost();
        host.setName(hostname);
        String contextPath = "";

        // 创建上下文对象，一个Context对应一个Web Application
        Context context = new StandardContext();
        context.setPath(contextPath);
        context.addLifecycleListener(new Tomcat.FixContextListener());

        // 主机添加上下文
        host.addChild(context);

        //引擎添加主机
        engine.addChild(host);

        // 服务设置容器，以及连接
        service.setContainer(engine);
        service.addConnector(connector);


        // 注册servlet 拦截所有请求
        tomcat.addServlet("", "dispatcher", new DispatcherServlet());
        context.addServletMappingDecoded("/*", "dispatcher");

        try {
            // 远程注册，模拟远程注册，本质注册到map中，
            RemoteMapRegister.register(HelloService.class.getName(),new URL(hostname,port));
            tomcat.start();
            System.out.println("http 服务启动.......");
            tomcat.getServer().await();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }


    }
}
